﻿using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.UI;

public class Principal : Page
{
    #region Exibir Mensagens Alert

    /// <summary>
    /// Exibe uma mensagem Alert
    /// </summary>
    public virtual void ExibirMensagem(string msg)
    {
        if (string.IsNullOrWhiteSpace(msg)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");", msg), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert e força um post para uma derminada Url
    /// </summary>
    public virtual void ExibirMensagem(string msg, string url)
    {
        if (string.IsNullOrWhiteSpace(msg)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");window.location=\"{1}\";", msg, url), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert e volta n páginas
    /// </summary>
    public virtual void ExibirMensagem(string msg, int qtd)
    {
        if (string.IsNullOrWhiteSpace(msg)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");history.go(-{1});", msg, qtd), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert e fecha a janela atual
    /// </summary>
    public virtual void ExibirMensagem(string msg, bool fechar)
    {
        // Se for definido para fechar a janela
        if (string.IsNullOrWhiteSpace(msg) || !fechar) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");window.close();", msg), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert
    /// </summary>
    public static void ExibirMensagem(string msg, Page page)
    {
        if (string.IsNullOrWhiteSpace(msg) || ReferenceEquals(page, null)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        page.ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");", msg), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert e força um post para uma derminada Url
    /// </summary>
    public static void ExibirMensagem(string msg, string url, Page page)
    {
        if (string.IsNullOrWhiteSpace(msg) || string.IsNullOrWhiteSpace(url) || ReferenceEquals(page, null)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        page.ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");window.location=\"{1}\";", msg, url), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert e volta n páginas
    /// </summary>
    public static void ExibirMensagem(string msg, int qtd, Page page)
    {
        if (string.IsNullOrWhiteSpace(msg) || ReferenceEquals(page, null)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        page.ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");history.go(-{1});", msg, qtd), true);
    }

    /// <summary>
    /// Exibe uma mensagem Alert e fecha a janela atual
    /// </summary>
    public static void ExibirMensagem(string msg, bool fechar, Page page)
    {
        // Se for definido para fechar a janela
        if (string.IsNullOrWhiteSpace(msg) || !fechar || ReferenceEquals(page, null)) return;

        // Caso haja aspas na mensagem, mudo para aspas simples
        msg = msg.Replace("\"", "'");

        // Caso haja quebras de linha, mudo para quebra de linha em JavaScript
        msg = msg.Replace(Environment.NewLine, "\\n");
        msg = msg.Replace("\n", "\\n");

        page.ClientScript.RegisterStartupScript(typeof(string), string.Empty, string.Format("window.alert(\"{0}\");window.close();", msg), true);
    }

    #endregion

    #region Propriedades

    /// <summary>
    /// Retorna o Nome da Página com a extensão
    /// </summary>
    public virtual string PageName
    {
        get { return Path.GetFileName(HttpContext.Current.Request.Url.AbsolutePath); }
    }

    /// <summary>
    /// Retorna o Nome da Página sem a extensão
    /// </summary>
    public virtual string PageNameWithoutExtension
    {
        get { return Path.GetFileNameWithoutExtension(HttpContext.Current.Request.Url.AbsolutePath); }
    }

    /// <summary>
    /// Retorna a Url corrente completa
    /// </summary>
    public virtual string CompleteUrl
    {
        get { return HttpContext.Current.Request.Url.AbsoluteUri.Trim(); }
    }

    /// <summary>
    /// Retorna a Url corrente completa, sem a QueryString
    /// </summary>
    public virtual string CompleteUrlWithoutQueryString
    {
        get { return CompleteUrl.Contains("?") ? CompleteUrl.Split(new[] { "?" }, StringSplitOptions.RemoveEmptyEntries)[0].Trim() : CompleteUrl; }
    }

    /// <summary>
    /// Retorna o IP do usuário corrente
    /// </summary>
    public virtual string UserIpAddress
    {
        get
        {
            var ip = string.Empty;

            if (HttpContext.Current.Request.ServerVariables["HTTP_X_CLIENTIP"] != null)
                ip = HttpContext.Current.Request.ServerVariables["HTTP_X_CLIENTIP"];
            else if (HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] != null)
                ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

            return ip;
        }
    }

    #endregion

    #region Generic Web Utils

    /// <summary>
    /// Recarrega a página corrente
    /// </summary>
    public virtual void ReloadPage()
    {
        Response.Redirect(CompleteUrl);
    }

    #endregion

    #region Trabalhando com Strings

    /// <summary>
    /// Retorna uma string substituindo as quebras de linha pela tag html "br"
    /// </summary>
    public static string ReplaceLineBreaksWithBr(string str)
    {
        if (!string.IsNullOrWhiteSpace(str))
        {
            str = str.Replace(Environment.NewLine, "<br />");
            str = str.Replace("\n", "<br />");
            str = str.Replace("\\n", "<br />");
        }

        return str;
    }

    #endregion

    #region MD5
    
    /// <summary>
    /// Criptografa uma senha ou uma string qualquer com o algoritmo MD5
    /// </summary>
    /// <param name="str">Senha</param>
    /// <returns>Senha Criptografada</returns>
    public static string GetMd5Hash(string str)
    {
        if (string.IsNullOrWhiteSpace(str))
            return string.Empty;

        try
        {
            var md5 = MD5.Create();
            var inputBytes = Encoding.Default.GetBytes(str);
            var hash = md5.ComputeHash(inputBytes);
            var sb = new StringBuilder();

            foreach (var t in hash)
                sb.AppendFormat("{0:X2}", t);

            return sb.ToString();
        }
        catch
        {
            return str;
        }
    } 

    #endregion
}